package net.interneteidee.servizi;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;

import net.interneteidee.dao.FatturaDao;
import net.interneteidee.dao.OrdineDao;
import net.interneteidee.entity.Fattura;
import net.interneteidee.entity.Ordine;

@Path("/ordinefattura")
@Produces( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Consumes( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Stateless
public class OrdineFatturaService{

	@Inject 
	OrdineDao ordineDao;
	
	@Inject
	FatturaDao fatturaDao;
	
	
	public OrdineFatturaService() {
		// TODO Auto-generated constructor stub
		super();
	}
	
	//-----------------Salvataggio------------------------------//
	public boolean addOrdine(Ordine ordine){
		try{
			if(ordine.getIdOrdine() == 0)
				ordineDao.save(ordine);
			else
				ordineDao.update(ordine);
			
			return true;
		}
		catch (Exception e) {
			return false;
		}
	}
	
	public void addFattura(Fattura fattura){
		
		if(fattura.getIdFattura() == 0)
			fatturaDao.save(fattura);
		else
			fatturaDao.update(fattura);
	}
	
	//---------------Aggiornamento----------------------------//
	public void updateOrdine(Ordine ordine){
		ordineDao.update(ordine);
	}
	
	public void updateFattura(Fattura fattura){
		fatturaDao.update(fattura);
	}
	
	//----------------Eliminazione----------------------------//
	public void removeOrdine(Ordine ordine){
		
		ordine.setStato("chiuso");
		ordineDao.save(ordine);
	}
	
	public void removeFattura(Fattura fattura){
		
		fattura.setStato("chiuso");
		fatturaDao.save(fattura);
	}
	
	
	//----------------Ricerca-----------------------//
	
	public Ordine findOrdineById(long idOrdine){
		return ordineDao.findById(idOrdine);
	}
	
	public boolean findOrdineByCodice(long codiceProdotto){
		if(ordineDao.findByCodice("codiceOrdine", codiceProdotto)!=null)
			return true;
		return false;
	}
	
	public boolean findFatturaByCodice(long codiceFattura){
		if(fatturaDao.findByCodice("codiceFattura", codiceFattura)!=null)
			return true;
		return false;
	}
	
	public List<Ordine> findOrdiniNonFatturati(){
		return ordineDao.findOrdiniNonFatturati();
	}
	
	public List<Ordine> findAllOrdini(){
		return ordineDao.findAll();
	}
	
	public List<Fattura> findFattureByStato(Date dataDa , Date dataA , String stato){
		return fatturaDao.findFatturaByStato(dataDa, dataA, stato);
	}
	
	public List<Fattura> findFattureDiUnDatoClienteByStato(Date dataDa , Date dataA , String stato, String principalCliente){
		return fatturaDao.findFatturaDiUnDatoClienteByStato(dataDa, dataA, stato,principalCliente);
	}
	
	public List<Fattura> findFattureInScadenza(){
		return fatturaDao.findFattureInScadenza();
	}
	
	
	
	public List<Ordine> findOrdiniByStato(Date dataDa , Date dataA , String stato){
		return ordineDao.findOrdiniByStato(dataDa, dataA, stato);
	}
	
	public List<Ordine> findOrdiniDiUnDatoClienteByStato(Date dataDa , Date dataA , String stato, String principalCliente){
		return ordineDao.findOrdiniDiUnDatoClienteByStato(dataDa, dataA, stato,principalCliente);
	}
	
	
	
	public List<Fattura> findAllFatture(){
		return fatturaDao.findAll();
	}
	
	public double calcolaImportoRiga(Object object){return 0.0;}
	
	
	public double calcolaImportoTotale(Object object){return 0.0;}
	
	
	/**
	 * restituisce il totale del fatturato in un dato mese di un dato anno 
	 */
	public double getFatturatoMensile(int mese , int anno){return 0.0;}
	
	
	/**
	 * @return restituisce la lista di tutti gli ordini che ancora non sono stati fatturati
	 */
	public List<Ordine> ordiniNonFatturati(){return null;} 
	
	
	//-------Metodi esporti al pubblico attraverso i webservices--------
	
	@GET
	@Path("fattureinscadenza")
	public List<Fattura> findFattureInScadenzaWS(@Context SecurityContext securityContext){
		
		List<Fattura> fattureInScadenza = fatturaDao.findFattureInScadenza();
		
//		if(!securityContext.isUserInRole("Admin"))
//			throw new WebApplicationException(Response.Status.FORBIDDEN);
//		
//		if(fattureInScadenza.size()==0)
//			throw new WebApplicationException(Response.Status.NOT_FOUND);
		
		return fattureInScadenza;
	}
	
	@GET
	@Path("ordininonfatturati")
	public List<Ordine> findOrdiniNonFatturatiWS(@Context SecurityContext securityContext){
		
		List<Ordine> ordiniNonFatturati  = ordineDao.findOrdiniNonFatturati();
		
		if(!securityContext.isUserInRole("Admin"))
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		if(ordiniNonFatturati.size()==0)
			throw new WebApplicationException(Response.Status.NOT_FOUND);
		
		return ordiniNonFatturati;
	}
	
}
